import cv2
import subprocess as sp

# 这里改成本地ip，端口号不变，文件夹自定义
rtspUrl = 'rtsp://192.168.50.150:8554/camera'

# 输入0就是表示读取0号摄像头
camera = cv2.VideoCapture(0)
if not camera.isOpened():
    raise Exception(f'Failed to open local camera...')

# 获取视频帧宽高
w = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
sizeStr = str(w) + 'x' + str(h)

# 获取视频帧率
fps = camera.get(cv2.CAP_PROP_FPS)
fps = int(fps)

# ffmpeg推送rtmp重点: 通过管道共享数据的方式
command = [
    'ffmpeg',
    # 're',
    # 无需询问即可覆盖输出文件
    # '-y',
    # 强制输入或输出文件格式
    '-f', 'rawvideo',
    # 设置视频编解码器。这是-codec:v的别名
    '-vcodec', 'rawvideo',
    # 设置像素格式
    '-pix_fmt', 'bgr24',
    # 设置图像大小
    '-s', sizeStr,
    # 设置帧率
    '-r', str(fps),
    # 输入
    '-i', '-',
    '-c:v', 'libx264',
    '-pix_fmt', 'yuv420p',
    '-preset', 'ultrafast',
    # 强制输入或输出文件格式
    '-f', 'rtsp',
    rtspUrl]

# 管道特性配置
pipe = sp.Popen(command, stdin=sp.PIPE)
while camera.isOpened():
    # 逐帧采集视频流
    ret, frame = camera.read()
    if not ret:
        break
    # 展示每一帧图片
    # cv2.imshow("camera", frame)
    # 结果帧处理 存入文件 / 推流 / ffmpeg 再处理
    pipe.stdin.write(frame.tostring())
# 释放摄像头
camera.release()
# 等待子进程完成
# output, error = pipe.communicate()
# 关闭子进程
pipe.terminate()
# 关闭窗口
cv2.destroyAllWindows()
